#ifndef HTTP_SERVER_H
#define HTTP_SERVER_H

#include <sys/epoll.h>
#include <netinet/in.h>
#include <map>
#include <string>
#include <chrono>
#include <mutex>
#include "thread_pool.h"

// 定义常量
const int MAX_EVENTS = 1024;       // epoll最大事件数
const int BUFFER_SIZE = 4096;      // 缓冲区大小
const int DEFAULT_PORT = 8080;     // 默认服务器端口
const int TIMEOUT = 60;            // 连接超时时间(秒)

// HTTP请求方法枚举(get\post\不支持的方法)
enum Method {
    GET, POST, UNSUPPORTED
};

// HTTP请求结构(包括请求方法、路径、HTTP版本)
struct HttpRequest {
    Method method;
    std::string path;
    std::string version;
    std::map<std::string, std::string> headers;
    std::string body;
};

// HTTP响应结构(包括HTTP版本、状态码、状态字符)
struct HttpResponse {
    std::string version;
    int status_code;
    std::string status_msg;
    std::map<std::string, std::string> headers;
    std::string body;
};

// 前置声明测试类
class HttpServerTest;

// HTTP服务器类
class HttpServer {
    // 声明测试类为友元，允许其访问所有成员
    friend class HttpServerTest;
public:
    // 构造函数，可指定端口
    HttpServer(int port = DEFAULT_PORT);
    
    // 析构函数
    ~HttpServer();
    
    // 启动服务器
    void start();

private:
    int epoll_fd_;  // epoll文件描述符
    int server_fd_;  // 服务器监听套接字
    int port_;  // 服务器端口
    struct epoll_event events_[MAX_EVENTS];  // epoll事件数组
    ThreadPool thread_pool_;  // 线程池，固定大小为8
    
    // 记录连接的最后活动时间
    std::map<int, std::chrono::steady_clock::time_point> connection_times_;
    std::mutex connection_mutex_;  // 保护连接时间映射的互斥锁
    
    // 初始化服务器
    bool init_server();
    
    // 处理新连接
    void handle_new_connection();
    
    // 处理客户端数据
    void handle_client_data(int client_fd);
    
    // 处理HTTP请求
    void handle_request(int client_fd, const HttpRequest& request);
    
    // 解析HTTP请求
    bool parse_request(const std::string& request_str, HttpRequest& request);
    
    // 创建错误响应
    HttpResponse create_error_response(int status_code, const std::string& status_msg);
    
    // 发送响应
    void send_response(int client_fd, const HttpResponse& response);
    
    // 关闭连接
    void close_connection(int client_fd);
    
    // 检查超时连接
    void check_timeouts();
    
    // 获取MIME类型
    std::string get_mime_type(const std::string& ext);
};

#endif // HTTP_SERVER_H
    